Repository navigation
Conversation
|
All contributors have signed the CLA. ✅ |
There was a problem hiding this comment.
ℹ️ No critical issues — one rough edge worth a look.
Reviewed changes
- Worker seam —
worker.WithReminderCheckadds a callback run beforesendRemindersends;falsesuppresses,errorfollows the job's retry policy.sendReminderruns it under a 10s deadline and re-readsbookings.statusafterwards to catch a cancellation during the lookup. - Handler check — new
Handler.ReminderAllowedloads the row wherebooking_hosts.user_id = bookings.host_idwith a non-emptyexternal_event_id(primary host only) and returns deliver when no such row exists. - Provider capability —
calendar.EventCancellationReaderplusService.EventCancelled, routed through the sameproviderForEventpath as updates/cancels. Providers without the capability (Microsoft, CalDAV) return(false, nil), preserving delivery. - Google read —
gcal.Client.EventCancelledGETs.../events/{id}?fields=statusviaDestinationClient, using the recorded calendar id when present. Onlystatus:"cancelled"suppresses; confirmed/tentative deliver; everything else errors. - Tests + docs — gcal status matrix, calendar routing, worker+handler integration, and an ARCHITECTURE §12 note.
Verified the load-bearing Google contract independently: a retained cancelled event returns HTTP 200 with status:"cancelled" from events.get, so suppression works in the normal window (Google purges cancelled events after ~30 days, after which the lookup degrades to the documented fail-closed error).
deepseek-v4.1-flash | 𝕏
|
I have read the CLA Document and I hereby sign the CLA |
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes
Reviewed the delta since the prior pullfrog review (3ede0fb), which addresses the hot-reload concern raised there.
- Google-only service reload — new
Handler.setGoogleCalendarbuilds a freshcalendar.Service, preserving the old non-Google primary plus every other registered provider and either replacing or removing onlygoogle.PatchGoogleSettingsnow routes both save and clear through it instead ofSetCalendar(nil)/ a gcal-only rebuild. - Snapshot safety — the replacement is published under
calMuwhile reading the old snapshot, so the previous provider map is never mutated and in-flight operations keep resolving on it. - Regression tests —
calendar_reload_test.gocovers primary/snapshot preservation;google_calendar_reload_test.godrives the real settings handler then the real reminder worker and asserts Microsoft/CalDAV reminders still send after both credential save and clear, plus continued refusal to send an unverifiable Google reminder.
Verified the prior concern is closed: clearing or saving Google credentials no longer drops Microsoft/CalDAV registrations, so those bookings' reminders still deliver. go test for the touched packages and go vet pass at fc5d5b5.
deepseek-v4.1-flash | 𝕏
shockalotti
left a comment
There was a problem hiding this comment.
Verified the bug on main (sendReminder only checks local status) and the fix placement is right: worker as single funnel, Handler.ReminderAllowed as owner, providerForEvent routing reuse, race re-check present. Tests are good. Three items before merge:
- Run CI on the branch. Only cla+pullfrog exist here; the full-suite claim is unconfirmed. Needs a real build + go test run.
- Decide fail-closed vs fail-open for transient lookup errors. A short Google outage at reminder time currently burns the job and permanently deletes reminders for live meetings. Either distinguish transient errors from definitive cancellation, or justify fail-closed explicitly in the PR.
- File a follow-up for Microsoft/CalDAV parity — same bug still exists there; an ARCHITECTURE note alone loses track of it.
Minor: EventCancelled hard-errors on unregistered stamped providers while update/cancel paths fall through — intentional, but worth a code comment.

Intent
Cancelling a meeting directly in Google Calendar can leave its Calnode booking confirmed, so queued reminders still tell the attendee to attend. This change suppresses the reminder when Google explicitly reports the primary host's stored event as cancelled.
The check uses the recorded provider, calendar and event ID, applies a 10-second request context, and rechecks local booking status after the lookup. Lookup errors follow the existing job retry policy instead of authorizing delivery. Saving or clearing Google credentials replaces only Google in a fresh service snapshot, preserving Microsoft/CalDAV registrations, the existing non-Google default provider, and in-flight operations.
Risks and limits
This fixes reminder delivery only. It does not change booking status, release availability, trigger refunds, or send cancellation messages. Only Google supports the new read check; other registered providers retain their current behavior. A missing connection, changed Google account, 404/410, or persistent API outage can exhaust retries and fail a reminder for an otherwise active booking. Secondary hosts' calendar copies do not decide cancellation.
The same fix is prepared for the maintained CoderPush fork in harley#6. This upstream PR contains only the reminder fix and no fork-specific configuration or migrations.
Validation
go vet ./...passed.No live booking or test email was created. The affected historical booking's current database row was not inspected.